¶

Машинное обучение. ВМК МГУ¶

Практическое задание 12: Кластеризация. Методы снижения размерности.¶

Уровень: **Базовый (Base)**¶

О формате сдачи¶

🔷 При решении ноутбука используйте данный шаблон

✅ Можно добавлять новые ячейки любых типов
❌ Не нужно удалять текстовые ячейки c разметкой частей ноутбука и формулировками заданий


🔷 При оценивании задач учитывается код

✅ Задания, в которых необходим код, обычно помечаются фразами "Your code here"/"Ваш код" и аналогичными
❌ Ответы на вопросы без сопутствующего кода оцениваются в 0 баллов
❌ Наличе работоспособного кода в ноутбуке, если на сказано иного, обязательно

🔷 При оценивании задач учитываются выводы

✅ Задания, в которых необходимы выводы, обычно помечаются фразами Вывод"/"Ответ на вопрос"/"Ваш текст" и аналогичными
✅ Обычно выводы подразумевают под собой текстовый ответ (можно писать markdown, latex).
✅ Сопутствующие изображения, графики, таблички - приветствуются!
❌ При отсутствии выводов задание не засчитается на полный балл


В этом задании вы..:

  • Познакомитесь с одним способом визуализации процесса обучения
  • Сравните между собой результаты разных способов кластеризации
  • Посмотрите и реализуете несколько метрик качества кластеризации
  • Попробуете разные методы снижения размерности

**Примерное время выполнения (execution time/время выполнения, если нажать run all) всех ячеек ноутбука при правильной реализации: 30 минут **


Перед началом выполнения переведите ноутбук в Доверенный режим (Trusted) для корректного отображения изображений:

In [ ]:
%config Completer.use_jedi = False
%load_ext autoreload
%autoreload 2

Подготовка рабочей среды¶

Сначала установим нужные нам версии библиотек. Мы гарантируем, что в данных версиях задание будет корректно отрабатывать.

После установки нужных версий, возможно, нужно перезагрузить среду (runtime), но скорее всего вам это не понадобится

На скачивание файла и установку понадобится не более 5 минут.

**Важно!**

Устанавливать нужные версии нужно каждый раз, когда создается новый рантайм. Например, если вы 2 часа подряд делаете это задание, то подготовить библиотеки достаточно 1 раз. Но если вы, например, начали в понедельник, затем закрыли/выключили ноутбук, то при продолжении в среду, вам нужно будет запустить рантайм заново и следовательно заново установить библиотеки.

**Важно!** Если вы предпочитаете делать практические задания на своем личном ноутбуке, то проверьте, что вы установили рабочее окружение в соответствии с гайдом.pdf)


**Важно!** В этом задании мы будем использовать полное виртуальное окружение, так как понадобятся библиотеки torch и tensorflow

Обратите внимание, что установка torch и tensorflow через pipможет сломать ваше окружение, особенно если вы используете GPU. Выполняйте их установку в соответствии с Вашей конфигурацией системы или в отдельном виртуальном окружении

In [ ]:
# !!! Данный блок будет работать только в Google-Colab !!!
! gdown 19ZRLAdlNBI5OScrbxXzO3iaWJSkJlXeA
! pip install -r /content/requirements_2024_25_for_colab_full.txt
Downloading...
From: https://drive.google.com/uc?id=19ZRLAdlNBI5OScrbxXzO3iaWJSkJlXeA
To: /content/requirements_2024_25_for_colab_full.txt
100% 424/424 [00:00<00:00, 1.58MB/s]
Collecting catboost==1.2.7 (from -r /content/requirements_2024_25_for_colab_full.txt (line 1))
  Downloading catboost-1.2.7-cp311-cp311-manylinux2014_x86_64.whl.metadata (1.2 kB)
Collecting gdown==5.1.0 (from -r /content/requirements_2024_25_for_colab_full.txt (line 2))
  Downloading gdown-5.1.0-py3-none-any.whl.metadata (5.7 kB)
Collecting h5py==3.11.0 (from -r /content/requirements_2024_25_for_colab_full.txt (line 3))
  Downloading h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.5 kB)
Requirement already satisfied: hyperopt==0.2.7 in /usr/local/lib/python3.11/dist-packages (from -r /content/requirements_2024_25_for_colab_full.txt (line 4)) (0.2.7)
Collecting ipympl==0.9.4 (from -r /content/requirements_2024_25_for_colab_full.txt (line 5))
  Downloading ipympl-0.9.4-py3-none-any.whl.metadata (8.7 kB)
Requirement already satisfied: ipywidgets==7.7.1 in /usr/local/lib/python3.11/dist-packages (from -r /content/requirements_2024_25_for_colab_full.txt (line 6)) (7.7.1)
Collecting keras==3.4.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 7))
  Downloading keras-3.4.1-py3-none-any.whl.metadata (5.8 kB)
Collecting lightgbm==4.4.0 (from -r /content/requirements_2024_25_for_colab_full.txt (line 8))
  Downloading lightgbm-4.4.0-py3-none-manylinux_2_28_x86_64.whl.metadata (19 kB)
Collecting matplotlib==3.7.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 9))
  Downloading matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.6 kB)
Requirement already satisfied: matplotlib-inline==0.1.7 in /usr/local/lib/python3.11/dist-packages (from -r /content/requirements_2024_25_for_colab_full.txt (line 10)) (0.1.7)
Collecting numpy==1.26.4 (from -r /content/requirements_2024_25_for_colab_full.txt (line 11))
  Downloading numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 61.0/61.0 kB 1.8 MB/s eta 0:00:00
Collecting pandas==2.1.4 (from -r /content/requirements_2024_25_for_colab_full.txt (line 12))
  Downloading pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (18 kB)
Collecting pep8==1.7.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 13))
  Downloading pep8-1.7.1-py2.py3-none-any.whl.metadata (22 kB)
Collecting plotly==5.15.0 (from -r /content/requirements_2024_25_for_colab_full.txt (line 14))
  Downloading plotly-5.15.0-py2.py3-none-any.whl.metadata (7.0 kB)
Collecting pycodestyle==2.12.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 15))
  Downloading pycodestyle-2.12.1-py2.py3-none-any.whl.metadata (4.5 kB)
Collecting pytest==7.4.4 (from -r /content/requirements_2024_25_for_colab_full.txt (line 16))
  Downloading pytest-7.4.4-py3-none-any.whl.metadata (7.9 kB)
Collecting scikit-image==0.23.2 (from -r /content/requirements_2024_25_for_colab_full.txt (line 17))
  Downloading scikit_image-0.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (14 kB)
Collecting scikit-learn==1.3.2 (from -r /content/requirements_2024_25_for_colab_full.txt (line 18))
  Downloading scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (11 kB)
Collecting scipy==1.13.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 19))
  Downloading scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (60 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 60.6/60.6 kB 5.7 MB/s eta 0:00:00
Collecting seaborn==0.13.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 20))
  Downloading seaborn-0.13.1-py3-none-any.whl.metadata (5.4 kB)
Collecting torch==2.3.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl.metadata (26 kB)
Collecting torchvision==0.18.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 22))
  Downloading torchvision-0.18.1-cp311-cp311-manylinux1_x86_64.whl.metadata (6.6 kB)
Collecting tqdm==4.66.5 (from -r /content/requirements_2024_25_for_colab_full.txt (line 23))
  Downloading tqdm-4.66.5-py3-none-any.whl.metadata (57 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 57.6/57.6 kB 5.9 MB/s eta 0:00:00
Collecting umap-learn==0.5.6 (from -r /content/requirements_2024_25_for_colab_full.txt (line 24))
  Downloading umap_learn-0.5.6-py3-none-any.whl.metadata (21 kB)
Collecting xgboost==2.1.1 (from -r /content/requirements_2024_25_for_colab_full.txt (line 25))
  Downloading xgboost-2.1.1-py3-none-manylinux_2_28_x86_64.whl.metadata (2.1 kB)
Requirement already satisfied: graphviz in /usr/local/lib/python3.11/dist-packages (from catboost==1.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 1)) (0.20.3)
Requirement already satisfied: six in /usr/local/lib/python3.11/dist-packages (from catboost==1.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 1)) (1.17.0)
Requirement already satisfied: beautifulsoup4 in /usr/local/lib/python3.11/dist-packages (from gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (4.13.4)
Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (3.18.0)
Requirement already satisfied: requests[socks] in /usr/local/lib/python3.11/dist-packages (from gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (2.32.3)
Requirement already satisfied: networkx>=2.2 in /usr/local/lib/python3.11/dist-packages (from hyperopt==0.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 4)) (3.4.2)
Requirement already satisfied: future in /usr/local/lib/python3.11/dist-packages (from hyperopt==0.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 4)) (1.0.0)
Requirement already satisfied: cloudpickle in /usr/local/lib/python3.11/dist-packages (from hyperopt==0.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 4)) (3.1.1)
Requirement already satisfied: py4j in /usr/local/lib/python3.11/dist-packages (from hyperopt==0.2.7->-r /content/requirements_2024_25_for_colab_full.txt (line 4)) (0.10.9.7)
Requirement already satisfied: ipython-genutils in /usr/local/lib/python3.11/dist-packages (from ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.2.0)
Requirement already satisfied: ipython<9 in /usr/local/lib/python3.11/dist-packages (from ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (7.34.0)
Requirement already satisfied: pillow in /usr/local/lib/python3.11/dist-packages (from ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (11.1.0)
Requirement already satisfied: traitlets<6 in /usr/local/lib/python3.11/dist-packages (from ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (5.7.1)
Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.11/dist-packages (from ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.17.1)
Requirement already satisfied: widgetsnbextension~=3.6.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (3.6.10)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (3.0.14)
Requirement already satisfied: absl-py in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (1.4.0)
Requirement already satisfied: rich in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (13.9.4)
Requirement already satisfied: namex in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (0.0.8)
Requirement already satisfied: optree in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (0.15.0)
Requirement already satisfied: ml-dtypes in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (0.4.1)
Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (24.2)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (1.3.2)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (4.57.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (1.4.8)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (3.2.3)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.11/dist-packages (from matplotlib==3.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 9)) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas==2.1.4->-r /content/requirements_2024_25_for_colab_full.txt (line 12)) (2025.2)
Requirement already satisfied: tzdata>=2022.1 in /usr/local/lib/python3.11/dist-packages (from pandas==2.1.4->-r /content/requirements_2024_25_for_colab_full.txt (line 12)) (2025.2)
Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.11/dist-packages (from plotly==5.15.0->-r /content/requirements_2024_25_for_colab_full.txt (line 14)) (9.1.2)
Requirement already satisfied: iniconfig in /usr/local/lib/python3.11/dist-packages (from pytest==7.4.4->-r /content/requirements_2024_25_for_colab_full.txt (line 16)) (2.1.0)
Requirement already satisfied: pluggy<2.0,>=0.12 in /usr/local/lib/python3.11/dist-packages (from pytest==7.4.4->-r /content/requirements_2024_25_for_colab_full.txt (line 16)) (1.5.0)
Requirement already satisfied: imageio>=2.33 in /usr/local/lib/python3.11/dist-packages (from scikit-image==0.23.2->-r /content/requirements_2024_25_for_colab_full.txt (line 17)) (2.37.0)
Requirement already satisfied: tifffile>=2022.8.12 in /usr/local/lib/python3.11/dist-packages (from scikit-image==0.23.2->-r /content/requirements_2024_25_for_colab_full.txt (line 17)) (2025.3.30)
Requirement already satisfied: lazy-loader>=0.4 in /usr/local/lib/python3.11/dist-packages (from scikit-image==0.23.2->-r /content/requirements_2024_25_for_colab_full.txt (line 17)) (0.4)
Requirement already satisfied: joblib>=1.1.1 in /usr/local/lib/python3.11/dist-packages (from scikit-learn==1.3.2->-r /content/requirements_2024_25_for_colab_full.txt (line 18)) (1.4.2)
Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn==1.3.2->-r /content/requirements_2024_25_for_colab_full.txt (line 18)) (3.6.0)
Requirement already satisfied: typing-extensions>=4.8.0 in /usr/local/lib/python3.11/dist-packages (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (4.13.2)
Requirement already satisfied: sympy in /usr/local/lib/python3.11/dist-packages (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (1.13.1)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (3.1.6)
Requirement already satisfied: fsspec in /usr/local/lib/python3.11/dist-packages (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (2025.3.2)
Collecting nvidia-cuda-nvrtc-cu12==12.1.105 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-cuda-runtime-cu12==12.1.105 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-cuda-cupti-cu12==12.1.105 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)
Collecting nvidia-cudnn-cu12==8.9.2.26 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)
Collecting nvidia-cublas-cu12==12.1.3.1 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-cufft-cu12==11.0.2.54 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-curand-cu12==10.3.2.106 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl.metadata (1.5 kB)
Collecting nvidia-cusolver-cu12==11.4.5.107 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)
Collecting nvidia-cusparse-cu12==12.1.0.106 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl.metadata (1.6 kB)
Collecting nvidia-nccl-cu12==2.20.5 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl.metadata (1.8 kB)
Collecting nvidia-nvtx-cu12==12.1.105 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl.metadata (1.7 kB)
Collecting triton==2.3.1 (from torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21))
  Downloading triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (1.4 kB)
Requirement already satisfied: numba>=0.51.2 in /usr/local/lib/python3.11/dist-packages (from umap-learn==0.5.6->-r /content/requirements_2024_25_for_colab_full.txt (line 24)) (0.60.0)
Requirement already satisfied: pynndescent>=0.5 in /usr/local/lib/python3.11/dist-packages (from umap-learn==0.5.6->-r /content/requirements_2024_25_for_colab_full.txt (line 24)) (0.5.13)
Requirement already satisfied: nvidia-nvjitlink-cu12 in /usr/local/lib/python3.11/dist-packages (from nvidia-cusolver-cu12==11.4.5.107->torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (12.5.82)
Requirement already satisfied: debugpy>=1.0 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.8.0)
Requirement already satisfied: jupyter-client>=6.1.12 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.1.12)
Requirement already satisfied: nest-asyncio in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.6.0)
Requirement already satisfied: psutil in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (5.9.5)
Requirement already satisfied: pyzmq>=17 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (24.0.1)
Requirement already satisfied: tornado>=6.1 in /usr/local/lib/python3.11/dist-packages (from ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.4.2)
Requirement already satisfied: setuptools>=18.5 in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (75.2.0)
Collecting jedi>=0.16 (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5))
  Downloading jedi-0.19.2-py2.py3-none-any.whl.metadata (22 kB)
Requirement already satisfied: decorator in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (4.4.2)
Requirement already satisfied: pickleshare in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.7.5)
Requirement already satisfied: prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (3.0.51)
Requirement already satisfied: pygments in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (2.18.0)
Requirement already satisfied: backcall in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.2.0)
Requirement already satisfied: pexpect>4.3 in /usr/local/lib/python3.11/dist-packages (from ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (4.9.0)
Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.11/dist-packages (from numba>=0.51.2->umap-learn==0.5.6->-r /content/requirements_2024_25_for_colab_full.txt (line 24)) (0.43.0)
Requirement already satisfied: notebook>=4.4.1 in /usr/local/lib/python3.11/dist-packages (from widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.5.7)
Requirement already satisfied: soupsieve>1.2 in /usr/local/lib/python3.11/dist-packages (from beautifulsoup4->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (2.6)
Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (3.0.2)
Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (3.4.1)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (2.3.0)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (2025.1.31)
Requirement already satisfied: PySocks!=1.5.7,>=1.5.6 in /usr/local/lib/python3.11/dist-packages (from requests[socks]->gdown==5.1.0->-r /content/requirements_2024_25_for_colab_full.txt (line 2)) (1.7.1)
Requirement already satisfied: markdown-it-py>=2.2.0 in /usr/local/lib/python3.11/dist-packages (from rich->keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (3.0.0)
Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from sympy->torch==2.3.1->-r /content/requirements_2024_25_for_colab_full.txt (line 21)) (1.3.0)
Requirement already satisfied: parso<0.9.0,>=0.8.4 in /usr/local/lib/python3.11/dist-packages (from jedi>=0.16->ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.8.4)
Requirement already satisfied: jupyter-core>=4.6.0 in /usr/local/lib/python3.11/dist-packages (from jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (5.7.2)
Requirement already satisfied: mdurl~=0.1 in /usr/local/lib/python3.11/dist-packages (from markdown-it-py>=2.2.0->rich->keras==3.4.1->-r /content/requirements_2024_25_for_colab_full.txt (line 7)) (0.1.2)
Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (23.1.0)
Requirement already satisfied: nbformat in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (5.10.4)
Requirement already satisfied: nbconvert>=5 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (7.16.6)
Requirement already satisfied: Send2Trash>=1.8.0 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.8.3)
Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.18.1)
Requirement already satisfied: prometheus-client in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.21.1)
Requirement already satisfied: nbclassic>=0.4.7 in /usr/local/lib/python3.11/dist-packages (from notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.2.0)
Requirement already satisfied: ptyprocess>=0.5 in /usr/local/lib/python3.11/dist-packages (from pexpect>4.3->ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.7.0)
Requirement already satisfied: wcwidth in /usr/local/lib/python3.11/dist-packages (from prompt-toolkit!=3.0.0,!=3.0.1,<3.1.0,>=2.0.0->ipython<9->ipympl==0.9.4->-r /content/requirements_2024_25_for_colab_full.txt (line 5)) (0.2.13)
Requirement already satisfied: platformdirs>=2.5 in /usr/local/lib/python3.11/dist-packages (from jupyter-core>=4.6.0->jupyter-client>=6.1.12->ipykernel>=4.5.1->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (4.3.7)
Requirement already satisfied: notebook-shim>=0.2.3 in /usr/local/lib/python3.11/dist-packages (from nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.2.4)
Requirement already satisfied: bleach!=5.0.0 in /usr/local/lib/python3.11/dist-packages (from bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (6.2.0)
Requirement already satisfied: defusedxml in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.7.1)
Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.3.0)
Requirement already satisfied: mistune<4,>=2.0.3 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (3.1.3)
Requirement already satisfied: nbclient>=0.5.0 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.10.2)
Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.11/dist-packages (from nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.5.1)
Requirement already satisfied: fastjsonschema>=2.15 in /usr/local/lib/python3.11/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (2.21.1)
Requirement already satisfied: jsonschema>=2.6 in /usr/local/lib/python3.11/dist-packages (from nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (4.23.0)
Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.11/dist-packages (from argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (21.2.0)
Requirement already satisfied: webencodings in /usr/local/lib/python3.11/dist-packages (from bleach!=5.0.0->bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.5.1)
Requirement already satisfied: tinycss2<1.5,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from bleach[css]!=5.0.0->nbconvert>=5->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.4.0)
Requirement already satisfied: attrs>=22.2.0 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (25.3.0)
Requirement already satisfied: jsonschema-specifications>=2023.03.6 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (2024.10.1)
Requirement already satisfied: referencing>=0.28.4 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.36.2)
Requirement already satisfied: rpds-py>=0.7.1 in /usr/local/lib/python3.11/dist-packages (from jsonschema>=2.6->nbformat->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (0.24.0)
Requirement already satisfied: jupyter-server<3,>=1.8 in /usr/local/lib/python3.11/dist-packages (from notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.16.0)
Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.17.1)
Requirement already satisfied: pycparser in /usr/local/lib/python3.11/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (2.22)
Requirement already satisfied: anyio>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (4.9.0)
Requirement already satisfied: websocket-client in /usr/local/lib/python3.11/dist-packages (from jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.8.0)
Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.11/dist-packages (from anyio>=3.1.0->jupyter-server<3,>=1.8->notebook-shim>=0.2.3->nbclassic>=0.4.7->notebook>=4.4.1->widgetsnbextension~=3.6.0->ipywidgets==7.7.1->-r /content/requirements_2024_25_for_colab_full.txt (line 6)) (1.3.1)
Downloading catboost-1.2.7-cp311-cp311-manylinux2014_x86_64.whl (98.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 98.7/98.7 MB 7.4 MB/s eta 0:00:00
Downloading gdown-5.1.0-py3-none-any.whl (17 kB)
Downloading h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.4 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.4/5.4 MB 92.4 MB/s eta 0:00:00
Downloading ipympl-0.9.4-py3-none-any.whl (516 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 516.3/516.3 kB 39.9 MB/s eta 0:00:00
Downloading keras-3.4.1-py3-none-any.whl (1.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 64.0 MB/s eta 0:00:00
Downloading lightgbm-4.4.0-py3-none-manylinux_2_28_x86_64.whl (3.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.6/3.6 MB 22.5 MB/s eta 0:00:00
Downloading matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.6/11.6 MB 111.9 MB/s eta 0:00:00
Downloading numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 18.3/18.3 MB 96.9 MB/s eta 0:00:00
Downloading pandas-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.2/12.2 MB 96.7 MB/s eta 0:00:00
Downloading pep8-1.7.1-py2.py3-none-any.whl (41 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.5/41.5 kB 3.6 MB/s eta 0:00:00
Downloading plotly-5.15.0-py2.py3-none-any.whl (15.5 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 15.5/15.5 MB 31.8 MB/s eta 0:00:00
Downloading pycodestyle-2.12.1-py2.py3-none-any.whl (31 kB)
Downloading pytest-7.4.4-py3-none-any.whl (325 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 325.3/325.3 kB 16.2 MB/s eta 0:00:00
Downloading scikit_image-0.23.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (14.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.7/14.7 MB 92.2 MB/s eta 0:00:00
Downloading scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (10.9 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 10.9/10.9 MB 67.9 MB/s eta 0:00:00
Downloading scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (38.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 38.6/38.6 MB 11.0 MB/s eta 0:00:00
Downloading seaborn-0.13.1-py3-none-any.whl (294 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 294.8/294.8 kB 28.2 MB/s eta 0:00:00
Downloading torch-2.3.1-cp311-cp311-manylinux1_x86_64.whl (779.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 779.2/779.2 MB 1.2 MB/s eta 0:00:00
Downloading torchvision-0.18.1-cp311-cp311-manylinux1_x86_64.whl (7.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.0/7.0 MB 105.6 MB/s eta 0:00:00
Downloading tqdm-4.66.5-py3-none-any.whl (78 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 78.4/78.4 kB 9.6 MB/s eta 0:00:00
Downloading umap_learn-0.5.6-py3-none-any.whl (85 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.7/85.7 kB 10.0 MB/s eta 0:00:00
Downloading xgboost-2.1.1-py3-none-manylinux_2_28_x86_64.whl (153.9 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 153.9/153.9 MB 5.8 MB/s eta 0:00:00
Downloading nvidia_cublas_cu12-12.1.3.1-py3-none-manylinux1_x86_64.whl (410.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 410.6/410.6 MB 4.2 MB/s eta 0:00:00
Downloading nvidia_cuda_cupti_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (14.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 14.1/14.1 MB 89.2 MB/s eta 0:00:00
Downloading nvidia_cuda_nvrtc_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (23.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 23.7/23.7 MB 69.9 MB/s eta 0:00:00
Downloading nvidia_cuda_runtime_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (823 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 823.6/823.6 kB 53.2 MB/s eta 0:00:00
Downloading nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl (731.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 731.7/731.7 MB 1.2 MB/s eta 0:00:00
Downloading nvidia_cufft_cu12-11.0.2.54-py3-none-manylinux1_x86_64.whl (121.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 121.6/121.6 MB 7.7 MB/s eta 0:00:00
Downloading nvidia_curand_cu12-10.3.2.106-py3-none-manylinux1_x86_64.whl (56.5 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 56.5/56.5 MB 12.7 MB/s eta 0:00:00
Downloading nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl (124.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 124.2/124.2 MB 7.1 MB/s eta 0:00:00
Downloading nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl (196.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 196.0/196.0 MB 6.5 MB/s eta 0:00:00
Downloading nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl (176.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 176.2/176.2 MB 6.6 MB/s eta 0:00:00
Downloading nvidia_nvtx_cu12-12.1.105-py3-none-manylinux1_x86_64.whl (99 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 99.1/99.1 kB 10.7 MB/s eta 0:00:00
Downloading triton-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (168.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 168.1/168.1 MB 6.8 MB/s eta 0:00:00
Downloading jedi-0.19.2-py2.py3-none-any.whl (1.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 74.3 MB/s eta 0:00:00
Installing collected packages: pep8, triton, tqdm, pytest, pycodestyle, plotly, nvidia-nvtx-cu12, nvidia-nccl-cu12, nvidia-cusparse-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, numpy, jedi, scipy, pandas, nvidia-cusolver-cu12, nvidia-cudnn-cu12, h5py, xgboost, torch, scikit-learn, scikit-image, matplotlib, lightgbm, keras, gdown, torchvision, seaborn, catboost, umap-learn, ipympl
  Attempting uninstall: triton
    Found existing installation: triton 3.2.0
    Uninstalling triton-3.2.0:
      Successfully uninstalled triton-3.2.0
  Attempting uninstall: tqdm
    Found existing installation: tqdm 4.67.1
    Uninstalling tqdm-4.67.1:
      Successfully uninstalled tqdm-4.67.1
  Attempting uninstall: pytest
    Found existing installation: pytest 8.3.5
    Uninstalling pytest-8.3.5:
      Successfully uninstalled pytest-8.3.5
  Attempting uninstall: plotly
    Found existing installation: plotly 5.24.1
    Uninstalling plotly-5.24.1:
      Successfully uninstalled plotly-5.24.1
  Attempting uninstall: nvidia-nvtx-cu12
    Found existing installation: nvidia-nvtx-cu12 12.4.127
    Uninstalling nvidia-nvtx-cu12-12.4.127:
      Successfully uninstalled nvidia-nvtx-cu12-12.4.127
  Attempting uninstall: nvidia-nccl-cu12
    Found existing installation: nvidia-nccl-cu12 2.21.5
    Uninstalling nvidia-nccl-cu12-2.21.5:
      Successfully uninstalled nvidia-nccl-cu12-2.21.5
  Attempting uninstall: nvidia-cusparse-cu12
    Found existing installation: nvidia-cusparse-cu12 12.5.1.3
    Uninstalling nvidia-cusparse-cu12-12.5.1.3:
      Successfully uninstalled nvidia-cusparse-cu12-12.5.1.3
  Attempting uninstall: nvidia-curand-cu12
    Found existing installation: nvidia-curand-cu12 10.3.6.82
    Uninstalling nvidia-curand-cu12-10.3.6.82:
      Successfully uninstalled nvidia-curand-cu12-10.3.6.82
  Attempting uninstall: nvidia-cufft-cu12
    Found existing installation: nvidia-cufft-cu12 11.2.3.61
    Uninstalling nvidia-cufft-cu12-11.2.3.61:
      Successfully uninstalled nvidia-cufft-cu12-11.2.3.61
  Attempting uninstall: nvidia-cuda-runtime-cu12
    Found existing installation: nvidia-cuda-runtime-cu12 12.5.82
    Uninstalling nvidia-cuda-runtime-cu12-12.5.82:
      Successfully uninstalled nvidia-cuda-runtime-cu12-12.5.82
  Attempting uninstall: nvidia-cuda-nvrtc-cu12
    Found existing installation: nvidia-cuda-nvrtc-cu12 12.5.82
    Uninstalling nvidia-cuda-nvrtc-cu12-12.5.82:
      Successfully uninstalled nvidia-cuda-nvrtc-cu12-12.5.82
  Attempting uninstall: nvidia-cuda-cupti-cu12
    Found existing installation: nvidia-cuda-cupti-cu12 12.5.82
    Uninstalling nvidia-cuda-cupti-cu12-12.5.82:
      Successfully uninstalled nvidia-cuda-cupti-cu12-12.5.82
  Attempting uninstall: nvidia-cublas-cu12
    Found existing installation: nvidia-cublas-cu12 12.5.3.2
    Uninstalling nvidia-cublas-cu12-12.5.3.2:
      Successfully uninstalled nvidia-cublas-cu12-12.5.3.2
  Attempting uninstall: numpy
    Found existing installation: numpy 2.0.2
    Uninstalling numpy-2.0.2:
      Successfully uninstalled numpy-2.0.2
  Attempting uninstall: scipy
    Found existing installation: scipy 1.14.1
    Uninstalling scipy-1.14.1:
      Successfully uninstalled scipy-1.14.1
  Attempting uninstall: pandas
    Found existing installation: pandas 2.2.2
    Uninstalling pandas-2.2.2:
      Successfully uninstalled pandas-2.2.2
  Attempting uninstall: nvidia-cusolver-cu12
    Found existing installation: nvidia-cusolver-cu12 11.6.3.83
    Uninstalling nvidia-cusolver-cu12-11.6.3.83:
      Successfully uninstalled nvidia-cusolver-cu12-11.6.3.83
  Attempting uninstall: nvidia-cudnn-cu12
    Found existing installation: nvidia-cudnn-cu12 9.3.0.75
    Uninstalling nvidia-cudnn-cu12-9.3.0.75:
      Successfully uninstalled nvidia-cudnn-cu12-9.3.0.75
  Attempting uninstall: h5py
    Found existing installation: h5py 3.13.0
    Uninstalling h5py-3.13.0:
      Successfully uninstalled h5py-3.13.0
  Attempting uninstall: xgboost
    Found existing installation: xgboost 2.1.4
    Uninstalling xgboost-2.1.4:
      Successfully uninstalled xgboost-2.1.4
  Attempting uninstall: torch
    Found existing installation: torch 2.6.0+cu124
    Uninstalling torch-2.6.0+cu124:
      Successfully uninstalled torch-2.6.0+cu124
  Attempting uninstall: scikit-learn
    Found existing installation: scikit-learn 1.6.1
    Uninstalling scikit-learn-1.6.1:
      Successfully uninstalled scikit-learn-1.6.1
  Attempting uninstall: scikit-image
    Found existing installation: scikit-image 0.25.2
    Uninstalling scikit-image-0.25.2:
      Successfully uninstalled scikit-image-0.25.2
  Attempting uninstall: matplotlib
    Found existing installation: matplotlib 3.10.0
    Uninstalling matplotlib-3.10.0:
      Successfully uninstalled matplotlib-3.10.0
  Attempting uninstall: lightgbm
    Found existing installation: lightgbm 4.5.0
    Uninstalling lightgbm-4.5.0:
      Successfully uninstalled lightgbm-4.5.0
  Attempting uninstall: keras
    Found existing installation: keras 3.8.0
    Uninstalling keras-3.8.0:
      Successfully uninstalled keras-3.8.0
  Attempting uninstall: gdown
    Found existing installation: gdown 5.2.0
    Uninstalling gdown-5.2.0:
      Successfully uninstalled gdown-5.2.0
  Attempting uninstall: torchvision
    Found existing installation: torchvision 0.21.0+cu124
    Uninstalling torchvision-0.21.0+cu124:
      Successfully uninstalled torchvision-0.21.0+cu124
  Attempting uninstall: seaborn
    Found existing installation: seaborn 0.13.2
    Uninstalling seaborn-0.13.2:
      Successfully uninstalled seaborn-0.13.2
  Attempting uninstall: umap-learn
    Found existing installation: umap-learn 0.5.7
    Uninstalling umap-learn-0.5.7:
      Successfully uninstalled umap-learn-0.5.7
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
google-colab 1.0.0 requires pandas==2.2.2, but you have pandas 2.1.4 which is incompatible.
thinc 8.3.6 requires numpy<3.0.0,>=2.0.0, but you have numpy 1.26.4 which is incompatible.
mizani 0.13.3 requires pandas>=2.2.0, but you have pandas 2.1.4 which is incompatible.
plotnine 0.14.5 requires matplotlib>=3.8.0, but you have matplotlib 3.7.1 which is incompatible.
plotnine 0.14.5 requires pandas>=2.2.0, but you have pandas 2.1.4 which is incompatible.
torchaudio 2.6.0+cu124 requires torch==2.6.0, but you have torch 2.3.1 which is incompatible.
tensorflow 2.18.0 requires keras>=3.5.0, but you have keras 3.4.1 which is incompatible.
Successfully installed catboost-1.2.7 gdown-5.1.0 h5py-3.11.0 ipympl-0.9.4 jedi-0.19.2 keras-3.4.1 lightgbm-4.4.0 matplotlib-3.7.1 numpy-1.26.4 nvidia-cublas-cu12-12.1.3.1 nvidia-cuda-cupti-cu12-12.1.105 nvidia-cuda-nvrtc-cu12-12.1.105 nvidia-cuda-runtime-cu12-12.1.105 nvidia-cudnn-cu12-8.9.2.26 nvidia-cufft-cu12-11.0.2.54 nvidia-curand-cu12-10.3.2.106 nvidia-cusolver-cu12-11.4.5.107 nvidia-cusparse-cu12-12.1.0.106 nvidia-nccl-cu12-2.20.5 nvidia-nvtx-cu12-12.1.105 pandas-2.1.4 pep8-1.7.1 plotly-5.15.0 pycodestyle-2.12.1 pytest-7.4.4 scikit-image-0.23.2 scikit-learn-1.3.2 scipy-1.13.1 seaborn-0.13.1 torch-2.3.1 torchvision-0.18.1 tqdm-4.66.5 triton-2.3.1 umap-learn-0.5.6 xgboost-2.1.1
In [ ]:
import catboost
assert(catboost.__version__ == '1.2.7')

Теперь можно приступать к выполнению задания! :)


0. Введение. [1 балл]¶

0.1 О задании¶

В данной работе вам предстоит познакомится с методами машинного обучения без учителя — кластеризацией и алгоритмами снижения размерности.

Рекомендуется использовать Kaggle так как в нём корректно работают интерактивные визуализации.

Здесь перечислены основные функции и библиотеки, которые могут понадобиться Вам в процессе выполнения задания. Подключение других библиотек возможно, но нежелательно. Работа каких-либо других библиотек не гарантируется.

In [ ]:
import os

import gdown

import scipy

import numpy as np

import tqdm.auto as tqdm

import matplotlib
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox

from ipywidgets import interactive, fixed, interact_manual, IntSlider, FloatLogSlider, FloatSlider

import torch
from torchvision.datasets import CIFAR10

# Необходима преварительная установка tensorflow
from keras.applications.inception_v3 import InceptionV3, preprocess_input

import sklearn

from sklearn.decomposition import KernelPCA
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering

# Библиотека umap-learn, а не umap
from umap import UMAP
from sklearn.manifold import TSNE, Isomap

from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification, make_moons, make_blobs
from sklearn.preprocessing import StandardScaler, MinMaxScaler

from warnings import simplefilter
from sklearn.exceptions import ConvergenceWarning
simplefilter("ignore", category=ConvergenceWarning)

0.3 Введение в интерактивные графики jupyter notebook [кросспроверка 1 балл]¶

Информация об особенностях интерактивных графиков вынесена в отдельный ноутбук Deep dive into .ipynb.ipynb. Ознакомьтесь с ним перед дальнейшим выполнением задания!

Задание 0.0 [кросспроверка, 1 балл][код, вопрос]¶

  • Поиграйтесь с интерактивными графиками.
  • Посмотрите в чём заключается смысл функций interactive, interact_manual, fixed, IntSlider, FloatLogSlider.
  • Какие ещё слайдеры и динамические виджеты бывают?
  • Как вам кажется, удобный ли это инструмент?
  • Предложите несколько примеров, когда он мог бы ещё пригодиться.
In [ ]:
# Ваш код здесь:\(º □ º l|l)/
def plot_line(x, y):
    plt.figure(figsize=(6, 2))
    plt.plot(x, y, 'b-', linewidth=2)
    plt.grid(True)
    plt.xlabel("X")
    plt.ylabel("Y")
    plt.title("Линейная зависимость Y = k * X + b")
    plt.show()

def update_plot(k=1.0, b=0.0):
    x = np.linspace(-10, 10, 200)  # Фиксированный диапазон X
    y = k * x + b                  # Линейная зависимость
    plot_line(x, y)

interactive(update_plot, k=(-5.0, 5.0, 0.1), b=(-5.0, 5.0, 0.1))
interactive(children=(FloatSlider(value=1.0, description='k', max=5.0, min=-5.0), FloatSlider(value=0.0, descr…
In [ ]:
interact_manual(update_plot, k=(-5.0, 5.0, 0.1), b=((-5.0, 5.0, 0.1)))
interactive(children=(FloatSlider(value=1.0, description='k', max=5.0, min=-5.0), FloatSlider(value=0.0, descr…
Out[ ]:
update_plot
def update_plot(k=1.0, b=0.0)
/content/<ipython-input-3-19db0385c9ff><no docstring>

**Ваш ответ здесь:** (o・・)ノ”(ノ<、):

  1. interactive – автоматически создаёт UI-элементы. interact_manual – похож на interactive, но добавляет кнопку для ручного обновления. fixed – фиксирует значение аргумента. IntSlider, FloatSlider – слайдеры для целых и вещественных чисел. FloatLogSlider – слайдер с логарифмической шкалой.
  2. Так же еще бывают следующие виджеты: Dropdown – выпадающий список, Checkbox – переключатель True/False, RadioButtons – выбор одного варианта из нескольких, Text / Textarea – ввод текста, Play / Animation – кнопка "воспроизведения" для анимации, ColorPicker – выбор цвета.
  3. Удобно для демонстраций
  4. Можно использовать в следующих случаях: для оптимального и интерактивныйподбора гиперпараметров при обучение моделей, для наглядного изучения графиков (например в физике, статистике) и тд.

Обратите внимание, что динамическое содержимое может некорректно сохраняться в jupyter notebook. Используйте его только для локальной визуализации. Все графики, необходимые для сдачи задания должны быть статическими. Переход в статический режим происходит с помощью магической команды %matplotlib inline.

Обязательно убедитесь, что все графики корректно сохранились корректно в ноутбуке перед сдачей в систему.

In [ ]:
%matplotlib inline
matplotlib.rcParams['figure.dpi'] = 300

0.4 Ещё несколько важных замечаний¶

При выполнении задания запрещено:

  1. Менять те seed, которые явно указаны в коде
  2. Менять прототипы функций, классов, методов классов
  3. Менять константы, используемые для генерации выборок

При оформлении задания обратите внимание на форматирование кода и на оформление графиков:

  • Весь код должен быть оформлен в строгом соответствии с PEP8

Графики должны быть с одной стороны понятными и информативными, а с другой стороны красивыми. Вот несколько пунктов, которые помогут удовлетворить этим требования:

  1. Все графики должны быть отрисованы в векторном формате. Обратите внимание, что смена режима графиков с динамического на статический и обратно может приводить к сбросу параметров отрисовки графиков. Переход в векторный режим можно выполнить с помощью команды matplotlib_inline.backend_inline.set_matplotlib_formats('pdf', 'svg'). Если изображения в векторном формате приводят к слишком большому размеру Jupyter Notebook можете использовать растровые изображения с высоким dpi. Напирмер, можно установить глобальный dpi в matplotlib: matplotlib.rcParams['figure.dpi'] = 300
  2. На всех графиках без исключения должна быть нарисована сетка
  3. Все графики и группы графиков должны иметь заголовок (title)
  4. При необходимости оси должны быть подписаны
  5. Если на графике отображено несколько сущностей (линии/точки/bar разных цветов, формы и так далее), то необходима исчерпывающая легенда
  6. Все линии на графиках должны быть чётко видны (нет похожих цветов или цветов, сливающихся с фоном и так далее)
  7. Масштаб по каждой оси на графике должен быть выбран правильно. Используйте масштабы log, symlog по необходимости
  8. Если отображена величина, имеющая очевидный диапазон значений (например, проценты могут быть от 0 до 100), то желательно масштабировать ось на весь диапазон значений (исключением является случай, когда вам необходимо показать малое отличие, которое незаметно в таких масштабах)
  9. Частота отметок по каждой оси должна быть тщательно подобрана, по необходимости задавайте [xy]ticks, [xy]ticklabels вручную. Подписи тиков на осях не должны сливаться как на одной оси, так и между ними
  10. Помните, что matplotlib умеет выполнять рендеринг Latex. Используйте эту возможность для написания формул в заголовках, легенде и в подписях осей
  11. Используйте красивую цветовую палитру с хорошо различимыми цветами. Примеры цветовых палитр можно посмотреть здесь. При наличи особенностей восприятия цвета можно использовать специальные палитры:
    plt.style.use('seaborn-colorblind')
    # Или
    plt.style.use('tableau-colorblind10')
    # Затем, при отрисовке графиков не используйте параметр cmap
    
  12. Графики должны быть не супер-микро и не супер-макро по размерам, так, чтобы можно было увидеть все, что нужно

1. Кластеризация на синтетических данных. [кросспроверка 5 балла, unittests 4 балла]¶

В данной части мы рассмотрим несколько наборов синтетических данных и сравним как разные алгоритмы кластеризации ведут себя в низкоразмерных и высокоразмерных пространствах

a. Двумерные данные¶

Сгенерируем двумерные данные с $4$ естественными кластерами разного размера и плотности.

In [ ]:
data_moons, labels_moons = make_moons(n_samples=300, shuffle=True, noise=0.09, random_state=6417)
data_moons, labels_moons = data_moons[labels_moons == 0], labels_moons[labels_moons == 0]

data_blobs, labels_blobs = make_blobs(
    n_samples=500, n_features=2, centers=[(0, -0.2), (-1.5, -1.5), (-1.5, 1.5)],
    cluster_std=[0.2, 0.4, 0.6], center_box=(-10.0, 10.0),
    shuffle=True, random_state=6417, return_centers=False
)

data = np.concatenate([data_moons, data_blobs])
labels = np.concatenate([labels_moons, labels_blobs + 1])

Определим вспомогательную функцию для отрисовки двумерных кластеризованных данных. При выполенении задания желательно пользоваться этой функцией для визуализации. При необходимости можете менять сигнатуру и поведение функции как вам удобно, оставляя стиль отрисовки в целом неизменным.

In [ ]:
def plot_2d_data(data, labels, title='Исходные данные', cmap='tab20', ax=None):
    '''
    Отрисовка 2d scatter plot.
    :param np.ndarray data: 2d массив точек
    :param Union[list, np.ndarray] labels: список меток для каждой точки выборки
    :param str title: Заголовок графика
    :param str cmap: Цветовая палитра
    :param ax Optional[matplotlib.axes.Axes]: Оси для отрисовки графика.
        Если оси не заданы, то создаётся новая фигура и сразу же происходит её отрисовка
        Иначе, график добавляется на существуюущие оси. Отрисовки фигуры не происходит
    '''
    n_clusters = len(np.unique(labels))

    if ax is None:
        fig, ax = plt.subplots(1, 1, figsize=(10, 5))
    else:
        fig = None

    scatter = ax.scatter(
        data[:, 0], data[:, 1], c=labels,
        cmap=plt.get_cmap(cmap, n_clusters)
    )

    cbar = plt.colorbar(scatter, label='Номер кластера', ax=ax)
    cbar.set_ticks(np.min(labels) + (np.arange(n_clusters) + 0.5) * (n_clusters - 1) / n_clusters)
    cbar.set_ticklabels(np.unique(labels))

    ax.set_title(title)
    ax.grid(True)

    if fig is not None:
        fig.tight_layout()
        plt.show()
In [ ]:
plot_2d_data(data, labels, title='Исходные данные', cmap='tab20')

**Задание 1.a.1 [кросспроверка, 1 балл][код]** ¶

Запустите следующие алгоритмы кластеризации на данной выборке: KMeans, DBSCAN, AgglomerativeClustering. Визуально подберите наилучшие параметры для этих алгоритмов (n_clusters, eps, min_samples, linkage). Изобразите наилучшие получившиеся разбиения на графиках.

**Советы**

  1. Можете использовать виджеты для ручного подбора параметров
  2. Используйте plot_2d_data для отрисовки графиков. Обязательно меняйте заголовок
  3. Помните, динамический контент может не сохраняться в ноутбуке. Поэтому после подбора оптимальных параметров нарисуйте соответствующий рисунок в статическом режиме
In [ ]:
# Ваш код здесь:\(º □ º l|l)/
plt.figure(figsize=(15, 5))

# KMeans
kmeans = KMeans(n_clusters=4, random_state=6417)
kmeans_labels = kmeans.fit_predict(data)
plt.subplot(131)
plot_2d_data(data, kmeans_labels, title='KMeans', ax=plt.gca()) #  n_clusters=4

dbscan = DBSCAN(eps=0.25, min_samples=10)
dbscan_labels = dbscan.fit_predict(data)
plt.subplot(132)
plot_2d_data(data, dbscan_labels, title='DBSCAN', ax=plt.gca()) #  eps=0.25, min_samples=10

agg = AgglomerativeClustering(n_clusters=4, linkage='ward')
agg_labels = agg.fit_predict(data)
plt.subplot(133)
plot_2d_data(data, agg_labels, title='Agglomerative', ax=plt.gca()) #  n_clusters=4, linkage=ward

plt.tight_layout()
plt.show()
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)

**Задание 1.a.2 [кросспроверка, 0.5 балла][вопрос]**¶

Основываясь на знании о работе данных алгоритмов, объясните, почему кластеры были сформированы таким образом. Какой алгоритм лучше всего работает на предложенных данных?

**Ваш ответ здесь:** (o・・)ノ”(ノ<、)

  1. KMeans разделяет на основе минимизации квадратичного расстояния точек до центра, поэтому здесь плохо отеделены кластеры 1 и 3(тк не учитывааем форму кластера, только расстояния внутри него)
  2. DBSCAN разделяет на основе плотности, здесь видим, что кластер 2 хорошо выделился, так как имеет высокую плотность, остальные кластеры плохо разделимы этим алгоритмом, тк имеют более низкие схожие плотности.
  3. Agglomerative разделяет как иерархическая кластеризация "снизу вверх", результат в нашем случае очень похож на КMeans, тк linkage='ward' тоже стремится к компактным сферическим кластерам.

В нашем случае как раз KMeans и Agglomerative лучше всего разделяют на 4 кластера.

b. Многомерные данные. Снижение размерности¶

Теперь попробуем кластеризовать данные в высокоразмерном пространстве. Существенным отличием от двумерного случая является невозможность прямой визуальной оценки кластеризации.

Одним из наглядных способов оценки кластеризации является снижение размерности. В данной части вам предлагается использовать алгоритм TSNE для визуализации данных.

**t-SNE (t-распределенное стохастическое вложение соседей)** — это алгоритм используемый для сокращения размерности данных, а также для визуализации многомерных данных в 2D или 3D, сохраняя их «структуру». Он фокусируется на том, чтобы близкие точки в исходном пространстве оставались близкими в новом, а далёкие — не обязательно. Для этого t-SNE моделирует сходство между точками в высоком измерении (через условные вероятности) и в низком (через распределение Стьюдента), затем итеративно подгоняет проекции, минимизируя разницу между этими сходствами. В итоге кластеры или локальные паттерны становятся видимыми, но абсолютные расстояния и глобальная структура могут искажаться. Алгоритм полезен для исследования данных, но требует осторожности в интерпретации.

In [ ]:
data, labels = make_classification(
    n_samples=1000, n_features=200, n_informative=100,
    n_repeated=0, n_classes=5, n_clusters_per_class=2, weights=None,
    flip_y=0.01, class_sep=2.5, hypercube=True, shift=0.0, scale=1.0,
    shuffle=True, random_state=6417
)

**Задание 1.b.1 [кросспроверка, 0.5 балла][код, вопрос]**¶

Примените алгоритм TSNE для снижения размерности до двух. Учтите, что TSNE суть есть метрический алгоритм и существенно зависит от масштаба признаков — некорректный и различающийся масштаб признаков гарантированно приведёт к неинтерпретируемым результатам. Можете попробовать подобрать гиперпараметры алгоритма для получения лучшей визуализации.

Изобразите получившиеся низкоразмерные вектора. Получилось ли сохранить кластеры при переходе в низкоразмерное пространство?

In [ ]:
# Ваш код здесь:\(º □ º l|l)/
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)

# Применение t-SNE
tsne = TSNE(
    n_components=2,          # снижаем до 2D
    perplexity=40,           # параметр, влияющий на баланс локальной/глобальной структуры
    early_exaggeration=2,    # усиливает кластеры на первых итерациях
    learning_rate=300,       # скорость обучения
    n_iter=1000,             # число итераций
    random_state=6417
)
data_tsne = tsne.fit_transform(data_scaled)


plt.figure(figsize=(10, 6))
plot_2d_data(data_tsne, labels, title='t-SNE проекция данных', cmap='tab10', ax=plt.gca())
plt.show()

**Ваш ответ здесь:** Можем выделить 5 основных кластеров после проекции, так же можем заметить, что внутри одного кластера данные тоже могут разбиваться на подкластеры.

**Задание 1.b.2 [кросспроверка, 0.5 балла][код]**¶

Примените алгоритмы кластеризации из предыдущего пункта к новым данным. Изобразите получившиеся кластеры в векторном пространстве, полученном с помощью TSNE. Не забудьте подобрать оптимальные параметры (те же, что и в пункте 1.a.1) для всех алгоритмов. Помните, что большинство алгоритмов кластеризации также являются метрическими и существенно зависят от масштаба признаков.

**Замечание:** Обратите внимание, что применять алгоритмы кластеризации нужно к высокоразмерным векторам, а низкоразмерные вектора необходимо использовать только для визуализации.

In [ ]:
# Ваш код здесь:\(º □ º l|l)/
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)

kmeans = KMeans(n_clusters=5, random_state=6417)
kmeans_labels = kmeans.fit_predict(data_scaled)

dbscan = DBSCAN(eps=0.3, min_samples=10)
dbscan_labels = dbscan.fit_predict(data_scaled)

agg = AgglomerativeClustering(n_clusters=5, linkage='ward')
agg_labels = agg.fit_predict(data_scaled)

fig, axes = plt.subplots(1, 3, figsize=(18, 5))

# KMeans
plot_2d_data(data_tsne, kmeans_labels,
            title='KMeans\n(n_clusters=5)',
            cmap='tab10', ax=axes[0])

# DBSCAN
unique_dbscan = np.unique(dbscan_labels)
n_dbscan_clusters = len(unique_dbscan) - (1 if -1 in unique_dbscan else 0)
plot_2d_data(data_tsne, dbscan_labels,
            title=f'DBSCAN\n(eps=3.5, min_samples=10)\nКластеров: {n_dbscan_clusters}',
            cmap='tab20', ax=axes[1])

# Agglomerative
plot_2d_data(data_tsne, agg_labels,
            title='Agglomerative\n(n_clusters=5, linkage=ward)',
            cmap='tab10', ax=axes[2])

plt.tight_layout()
plt.show()
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)

**Задание 1.b.3 [кросспроверка, 0.5 балла][вопрос]**¶

Опишите получившиеся результаты. Все ли алгоритмы одинаково хорошо разделяют данные? Если какой-то алгоритм не справился с задачей, то предположите почему.

**Ваш ответ здесь:** Видим, что KMeans и Agglomerative алгоритмы справились, хоть и чуть хуже по сравнению с двумерным случаем. DBSCAN совсем не справился, не найдя разных класстеров. Это могло произойти, потому что В 200D пространстве все точки становятся примерно равноудалёнными и понятие "плотности" теряет смысл.

c. Методы оценки кластеризации. Внутренние и внешние метрики.¶

Визуальная оценка кластеризации при работе с высокоразмерными данными затруднительна, так как существенно зависит от выбранного метода снижения размерности, который может плохо работать на конкретных данных. С другой стороны, визуальная оценка — субъективна. Поэтому необходимы численные оценки качества кластеризации.

В данном разделе вам нужно будет реализовать две метрики кластеризации и проверить их на практике.

Существует два основных подхода к оценке кластеризации — внутренние и внешние метрики. Первые используют только информацию о векторах-признаках объектов и метки кластеров, полученные из алгоритма кластеризации. Внешние же, используют информацию об истинной разметке объектов.

Silhouette¶

Метрика силуэт является классическим представителем внутренних метрик кластеризации. Её суть заключается в оценке двух параметров, характеризующих выделенные кластеры — компактность и отделимость.

Положим, что $C_{i}$ — номер кластера для объекта $i$.

$s_{i}$ — компактность кластеризации объекта $i$ определяется как среднее расстояние от него до всех объектов того же кластера: $$s_{i} = \frac{1}{|\{j : C_{j} = C_{i}\}| - 1} \sum\limits_{j : C_{j} = C_{i}} || x_{i} - x_{j} ||$$

$d_{i}$ — отделимость кластеризации объекта $i$ определяется как среднее расстояние от него до всех объектов второго по близости кластера: $$ d_{i} = \min_{C: C \neq C_{i}} \frac{1}{|\{j : C_{j} = C\}|} \sum\limits_{j : C_{j} = C} || x_{i} - x_{j} || $$

Тогда силуэт объекта $i$: $$\text{sil}_{i} = \frac{d_{i} - s_{i}}{\max(d_{i},s_{i})}$$

И, наконец, коэффициент силуэта для выборки определяется как среднее силуэтов объектов: $$S = \frac{1}{|X|}\sum\limits_{i} \text{sil}_{i}$$

Если кластер состоит из одного объекта, то его силуэт равен нулю.

**Задание 1.с.1 [unittests, 2 баллa]**¶

Реализуйте вычисление коэффициента силуэта для заданного разбиения. Подробная спецификация и описание входных данных к тестам указаны в описании задания.

При реализации обратите внимание на следующие пункты:

  1. При вычислении не должно возникать warning, бесконечностей и nan-ов
  2. Используйте не более одного цикла
  3. Учтите, что метки кластеров могут идти не по порядку и принимать произвольные значения
  4. Если в данных присутствует один кластер, то считайте что силуэт равен 0
  5. Если $s_{i} = d_{i} = 0 \Longrightarrow \text{sil}_{i} = 0$
  6. Разрешено использовать sklearn.metrics.pairwise_distances и аналоги
  7. Запрещено использовать любые библиотечные реализации коэффициента силуэта

Входные данные тестов удовлетворяют одному из следующих ограничений:

  1. Число объектов $n \le 3000$, размерность пространства $d \le 1200$
  2. Число объектов $n \le 5000$, размерность пространства $d = 1$

Несколько важных замечаний:

**Замечание:** Запрещается пользоваться библиотеками, импорт которых не объявлен в файле с шаблонами функций.

**Замечание:** Задания, в которых есть решения, содержащие в каком-либо виде взлом тестов, дополнительные импорты и прочие нечестные приемы, будут автоматически оценены в $0$ баллов без права пересдачи задания.

**Замечание:** Под циклами далее подразумеваются как явные Python-циклы (for, while, list comprehension, ...), так и неявное использование таких циклов внутри библиотек (np.apply_along_axis и подобные). В случае возникновения ошибки Time limit проверьте код на соответствие числа используемых циклов с требованиями к реализации.

**Замечание:** Для самопроверки доступны как публичные тесты (смотрите описание задания), так и тесты внутри Jupyter Notebook

In [ ]:
def silhouette_score(x, labels):
    '''
    :param np.ndarray x: Непустой двумерный массив векторов-признаков
    :param np.ndarray labels: Непустой одномерный массив меток объектов
    :return float: Коэффициент силуэта для выборки x с метками labels
    '''

    # Ваш код здесь:\(º □ º l|l)/
    dist_matrix = sklearn.metrics.pairwise_distances(x)
    num_clusters, count_clusters = np.unique(labels, return_counts=True)
    len_labels = len(labels)

    if len(num_clusters) <= 1:
        return 0

    masks = np.zeros((len_labels, len(num_clusters))).astype(bool)
    sum_dists = np.zeros((len_labels, len(num_clusters)))
    sizes_clusters = np.zeros(len_labels)

    for i, cluster in enumerate(num_clusters):
        masks[:, i] = labels == cluster
        sum_dists[:, i] = np.sum(dist_matrix[:, labels == cluster], axis=1)
        sizes_clusters[labels == cluster] = np.sum(labels == cluster)

    one_elem_cluster = sizes_clusters == 1
    s = sum_dists[masks]
    s[one_elem_cluster] = 0
    s[~one_elem_cluster] /= (sizes_clusters[~one_elem_cluster] - 1)
    d = np.min(((sum_dists / count_clusters)[~masks]).reshape(len_labels, -1), axis=1)
    d[one_elem_cluster] = 0
    ans = np.zeros(len_labels)
    max_s = np.maximum(s, d)
    np.divide(d - s, max_s, out=ans, where=(max_s != 0))
    sil_score = np.mean(ans)


    return sil_score

**Задание 1.c.2 [кросспроверка, 1 балл][код, вопрос]**¶

Посчитайте аналитически коэффициенты силуэта для объектов из примера ниже. Посчитайте силуэт аналитически и сравните его с выводом Вашей функции silhouette_score.

**Замечание:** Приведите подробные выкладки с использованием $\LaTeX$ (включая значения $s_{i}, d_{i}$). Используйте те же обозначения, что и в теоретической справке выше. Итоговый ответ для силуэта запишите с точностью три знака после запятой.

In [ ]:
fig, ax = plt.subplots(1, 1, figsize=(10, 5))
ax.scatter([0, 2], [0, 2], s=100, c='r', label='Первый класс')
ax.scatter([0, 1], [1, 0], s=100, c='b', label='Второй класс')

ax.annotate('1', (0.1, 0.1))
ax.annotate('2', (0.1, 1.1))
ax.annotate('3', (1.1, 0.1))
ax.annotate('4', (1.9, 1.9))

ax.set_title('Выборка к заданию')
ax.grid(True)
ax.legend()

fig.tight_layout()
plt.show()

**Ваш ответ здесь:** (o・・)ノ”(ノ<、)

Данные точки:

Класс 0 (красные): $A_1(0,0)$, $A_4(2,2)$

Класс 1 (синие): $A_2(0,1)$, $A_3(1,0)$

  1. Запишем матрицу попарных расстояний

(евклидово расстояния между всеми точками):

D = \begin{pmatrix} d(A_1,A_1) & d(A_1,A_2) & d(A_1,A_3) & d(A_1,A_4) \\ d(A_2,A_1) & d(A_2,A_2) & d(A_2,A_3) & d(A_2,A_4) \\ d(A_3,A_1) & d(A_3,A_2) & d(A_3,A_3) & d(A_3,A_4) \\ d(A_4,A_1) & d(A_4,A_2) & d(A_4,A_3) & d(A_4,A_4) \\ \end{pmatrix} = \begin{pmatrix} 0 & 1 & 1 & 2\sqrt{2} \\ 1 & 0 & \sqrt{2} & \sqrt{5} \\ 1 & \sqrt{2} & 0 & \sqrt{5} \\ 2\sqrt{2} & \sqrt{5} & \sqrt{5} & 0 \\ \end{pmatrix}

  1. Рассчитаем для каждой точки sᵢ и dᵢ

Для точки $A_1$ ​ (класс 0): \begin{align} s_1 &= d(A_1,A_4) = 2\sqrt{2} \approx 2.828 \ d_1 &= \frac{d(A_1,A_2) + d(A_1,A_3)}{2} = \frac{1 + 1}{2} = 1 \ sil_1 &= \frac{d_1 - s_1}{\max(s_1,d_1)} = \frac{1 - 2.828}{2.828} \approx -0.646 \end{align}

Для точки $A_2$ (класс 1): \begin{align} s_2 &= d(A_2,A_3) = \sqrt{2} \approx 1.414 \ d_2 &= \frac{d(A_2,A_1) + d(A_2,A_4)}{2} = \frac{1 + \sqrt{5}}{2} \approx \frac{1 + 2.236}{2} \approx 1.618 \ sil_2 &= \frac{d_2 - s_2}{\max(a_2,b_2)} = \frac{1.618 - 1.414}{1.618} \approx 0.126 \end{align}

Для точки $A_3$ ​ (класс 1): \begin{align} s_3 &= d(A_3,A_2) = \sqrt{2} \approx 1.414 \ d_3 &= \frac{d(A_3,A_1) + d(A_3,A_4)}{2} = \frac{1 + \sqrt{5}}{2} \approx 1.618 \ sil_3 &= \frac{d_3 - s_3}{\max(s_3,d_3)} = \frac{1.618 - 1.414}{1.618} \approx 0.126 \end{align}

Для точки $A_4$ (класс 0): \begin{align} s_4 &= d(A_4,A_1) = 2\sqrt{2} \approx 2.828 \ d_4 &= \frac{d(A_4,A_2) + d(A_4,A_3)}{2} = \frac{\sqrt{5} + \sqrt{5}}{2} \approx 2.236 \ sil_4 &= \frac{d_4 - s_4}{\max(s_4,d_4)} = \frac{2.236 - 2.828}{2.828} \approx -0.209 \end{align}

  1. Итоговый коэффициент силуэта \begin{align} sil = \frac{\sum_{i=1}^4 sil_i}{4} = \frac{sil_1 + sil_2 + sil_3 + sil_4}{4} = \frac{(-0.646) + 0.126 + 0.126 + (-0.209)}{4} \approx -0.151 \end{align}
In [ ]:
# Ваш код здесь:\(º □ º l|l)/
X = np.array([[0,0], [0,1], [1,0], [2,2]])
labels = np.array([0, 1, 1, 0])

round(silhouette_score(X, labels), 3)
Out[ ]:
-0.151

Результаты совпали)

Убедитесь, что Ваша реализация проходит минимальные тесты:

In [ ]:
assert np.allclose(
    silhouette_score(
        np.array([[0, 0.], [0, 1], [1, 0], [2, 2]]), np.array([1, 0, 0, 1])
    ),
    np.mean([-0.64644661,  0.12596795,  0.12596795, -0.20943058])
)

assert np.allclose(
    silhouette_score(
        np.array([[0, 0.], [0, 1], [1, 0], [2, 2], [1, 1], [2, 0]]), np.array([1, 0, 0, 1, 2, 2])
    ),
    np.mean([-0.64644661,  0.12596795, -0.29289322, -0.39644661, -0.29289322, 0.12596795])
)

B-Cubed¶

Пусть существует разметка $(y_1, ... , y_l)$, не участвующая в обучении. Мы не использовали эту разметку в качестве дополнительного признака, так как нам не хочется мотивировать модель данным признаком. Тогда предлагается ввести оценку качества алгоритма кластеризации при помощи внешней разметки, саму же разметку тогда называют gold standard.

Один из вариантов учесть gold standard разметку — внешняя метрика B-Cubed. Данная метрика позволяет определять следующие особенности кластеризации:

  1. Гомогенность. Базовое свойство разделения разных объектов в разные кластеры:

  1. Полнота. Один кластер не должен дробиться на несколько маленьких:

  1. Rag-bag. Весь мусор должен быть в одном "мусорном"кластере, чтобы остальные кластеры были "чистыми":

  1. Cluster size vs. quantity. Лучше испортить один кластер с целью улучшить качество множества других:

Пусть $L(x)$ — gold standard, $C(x)$ — номер кластера, выдаваемый рассматриваемым алгоритмом.

Рассмотрим несколько величин: $$ \text{Correctness}(x, x^{\prime}) = \begin{cases} 1 , C(x) = C(x^{\prime}) ∧ L(x) = L(x^{\prime})\\ 0 , иначе \end{cases} $$ $$ \text{Precision-BCubed} = \underset{x}{\text{Avg}} \underset{x^{\prime}:C(x)=C(x^{\prime})}{\text{Avg}} \text{Correctness}(x, x^{\prime}) $$ $$ \text{Recall-BCubed} = \underset{x}{\text{Avg}} \underset{x^{\prime}:L(x)=L(x^{\prime})}{\text{Avg}} \text{Correctness}(x, x^{\prime}) $$

Тогда, $$ \text{B-Cubed} = F_{1} = 2\frac{\text{Precision-BCubed}\times\text{Recall-BCubed}}{\text{Precision-BCubed}+\text{Recall-BCubed}} $$

**Задание 1.с.3 [unittests, 2 баллa]**¶

Реализуйте вычисление метрики B-Cubed. Подробная спецификация и описание входных данных к тестам указаны в описании задания.

При реализации обратите внимание на следующие пункты:

  1. При вычислении не должно возникать warning, бесконечностей и nan-ов.
  2. Использование циклов запрещено
  3. Обратите внимание на параметр where у функций-агрегаторов в numpy ($numpy \geq 1.20.0$).
  4. Запрещено использовать любые библиотечные реализации B-Cubed.

Входные данные тестов удовлетворяют одному из следующих ограничений:

  1. Число объектов n ⩽ 1000, число подтестов в одном тесте T ⩽ 70

Несколько важных замечаний:

**Замечание:** Запрещается пользоваться библиотеками, импорт которых не объявлен в файле с шаблонами функций.

**Замечание:** Задания, в которых есть решения, содержащие в каком-либо виде взлом тестов, дополнительные импорты и прочие нечестные приемы, будут автоматически оценены в $0$ баллов без права пересдачи задания.

**Замечание:** Под циклами далее подразумеваются как явные Python-циклы (for, while, list comprehension, ...), так и неявное использование таких циклов внутри библиотек (np.apply_along_axis и подобные). В случае возникновения ошибки Time limit проверьте код на соответствие числа используемых циклов с требованиями к реализации.

**Замечание:** Для самопроверки доступны как публичные тесты (смотрите описание задания), так и тесты внутри Jupyter Notebook

In [ ]:
def bcubed_score(true_labels, predicted_labels):
    '''
    :param np.ndarray true_labels: Непустой одномерный массив меток объектов
    :param np.ndarray predicted_labels: Непустой одномерный массив меток объектов
    :return float: B-Cubed для объектов с истинными метками true_labels и предсказанными метками predicted_labels
    '''

    # Ваш код здесь:\(º □ º l|l)/
    true_uniq, true_inv, true_count = np.unique(true_labels, return_inverse=True, return_counts=True)
    predicted_uniq, predicted_inv, predicted_count = np.unique(predicted_labels, return_inverse=True,
                                                               return_counts=True)
    true_labels[true_labels == 0] = true_uniq[-1] + 1
    predicted_labels[predicted_labels == 0] = predicted_uniq[-1] + 1
    correctness = np.ones((len(true_labels), len(predicted_labels)))
    correctness[(true_labels / true_labels[:, None]) != 1] = 0
    correctness[(predicted_labels / predicted_labels[:, None]) != 1] = 0
    precision = np.mean(np.sum(correctness, axis=1) / predicted_count[predicted_inv])
    recall = np.mean(np.sum(correctness, axis=1) / true_count[true_inv])
    score = 2 * precision * recall / (precision + recall)

    return score

Убедитесь, что Ваша реализация проходит минимальные тесты:

In [ ]:
assert np.allclose(bcubed_score(np.array([1]), np.array([1])), 1.0)
assert np.allclose(bcubed_score(np.array([1]), np.array([2])), 1.0)
assert np.allclose(bcubed_score(np.array([1, 2]), np.array([1, 1])), 2. / 3)
assert np.allclose(bcubed_score(np.array([1, 2]), np.array([1, 2])), 1.0)
assert np.allclose(bcubed_score(np.array([1, 2]), np.array([43, 12])), 1.0)
assert np.allclose(bcubed_score(np.array([1, 1, 2, 2]), np.array([1, 1, 1, 2])), 12. / 17)
assert np.allclose(bcubed_score(np.array([1, 2, 3, 4, 5]), np.array([1, 1, 1, 2, 2])), 4. / 7)

**Задание 1.с.4 [кросспроверка, 1 балл][код, вопрос]** ¶

  • Для каждого из трёх алгоритмов кластеризации переберите основные параметры (n_clusters, eps, min_samples) и замерьте качество кластеризации многомерных данных с помощью коэффициента силуэта и метрики B-Cubed.
  • Для каждого из алгоритмов на одной фигуре изобразите четыре графика — в первой строке два графика с зависимостью коэффициента силуэта и метрики B-Cubed от варьируемого параметра. Во второй строке — визуализация кластеризации с оптимальным параметром, выбранным с помощью первой и второй метрики (можете использовать plot_2d_data с параметром ax). Для DBSCAN перебирайте оба параметра одновременно и изобразите 2d-heatmap для каждой из метрик. Можете использовать вспомогательные функции для создания heatmap.
  • Совпали ли оптимальные параметры, определённые по этим метрикам? Совпали ли они с теми параметрами которые вы подобрали в предыдущем задании? Предположите почему они совпали/не совпали.
  • Можно ли использовать данные метрики для оценки кластеризации между разными алгоритмами? Какая из них лучше отражает качество?
In [ ]:
# Ваш код здесь:\(º □ º l|l)/
from matplotlib.colors import LinearSegmentedColormap
from sklearn.metrics import silhouette_score

def plot_clustering_results(data, true_labels, algorithm, param_grid):
    fig = plt.figure(figsize=(15, 12))

    # 1. Подготовка данных для графиков
    if algorithm == 'DBSCAN':
        eps_values = param_grid['eps']
        min_samples_values = param_grid['min_samples']
        sil_scores = np.zeros((len(eps_values), len(min_samples_values)))
        bcubed_scores = np.zeros_like(sil_scores)

        for i, eps in enumerate(eps_values):
            for j, min_samples in enumerate(min_samples_values):
                model = DBSCAN(eps=eps, min_samples=min_samples)
                pred_labels = model.fit_predict(data)

                if len(np.unique(pred_labels)) > 1:
                    sil_scores[i,j] = silhouette_score(data, pred_labels)
                    bcubed_scores[i,j] = bcubed_score(true_labels, pred_labels)
                else:
                    sil_scores[i,j] = -1
                    bcubed_scores[i,j] = 0
    else:
        n_clusters_values = param_grid['n_clusters']
        sil_scores = []
        bcubed_scores = []

        for n_clusters in n_clusters_values:
            if algorithm == 'KMeans':
                model = KMeans(n_clusters=n_clusters, random_state=6417)
            else:
                model = AgglomerativeClustering(n_clusters=n_clusters, linkage='ward')

            pred_labels = model.fit_predict(data)
            sil_scores.append(silhouette_score(data, pred_labels))
            bcubed_scores.append(bcubed_score(true_labels, pred_labels))

    # 2. Создание графиков
    if algorithm == 'DBSCAN':
        # Heatmap для Silhouette
        ax1 = fig.add_subplot(221)
        im1 = ax1.imshow(sil_scores, cmap='viridis', origin='lower',
                        extent=[min_samples_values[0], min_samples_values[-1],
                               eps_values[0], eps_values[-1]])
        ax1.set_title('Silhouette Score')
        ax1.set_xlabel('min_samples')
        ax1.set_ylabel('eps')
        fig.colorbar(im1, ax=ax1)

        # Heatmap для B-Cubed
        ax2 = fig.add_subplot(222)
        im2 = ax2.imshow(bcubed_scores, cmap='viridis', origin='lower',
                        extent=[min_samples_values[0], min_samples_values[-1],
                               eps_values[0], eps_values[-1]])
        ax2.set_title('B-Cubed Score')
        ax2.set_xlabel('min_samples')
        ax2.set_ylabel('eps')
        fig.colorbar(im2, ax=ax2)
    else:
        # Графики для KMeans/Agglomerative
        ax1 = fig.add_subplot(221)
        ax1.plot(n_clusters_values, sil_scores, 'bo-')
        ax1.set_title('Silhouette Score')
        ax1.set_xlabel('Number of clusters')
        ax1.grid(True)

        ax2 = fig.add_subplot(222)
        ax2.plot(n_clusters_values, bcubed_scores, 'ro-')
        ax2.set_title('B-Cubed Score')
        ax2.set_xlabel('Number of clusters')
        ax2.grid(True)

    # 3. Визуализация лучших кластеризаций
    if algorithm == 'DBSCAN':
        best_sil_idx = np.unravel_index(np.argmax(sil_scores), sil_scores.shape)
        best_bcubed_idx = np.unravel_index(np.argmax(bcubed_scores), bcubed_scores.shape)

        best_sil_model = DBSCAN(eps=eps_values[best_sil_idx[0]],
                              min_samples=min_samples_values[best_sil_idx[1]])
        best_bcubed_model = DBSCAN(eps=eps_values[best_bcubed_idx[0]],
                                 min_samples=min_samples_values[best_bcubed_idx[1]])
    else:
        best_sil_idx = np.argmax(sil_scores)
        best_bcubed_idx = np.argmax(bcubed_scores)

        if algorithm == 'KMeans':
            best_sil_model = KMeans(n_clusters=n_clusters_values[best_sil_idx],
                                   random_state=6417)
            best_bcubed_model = KMeans(n_clusters=n_clusters_values[best_bcubed_idx],
                                      random_state=6417)
        else:
            best_sil_model = AgglomerativeClustering(n_clusters=n_clusters_values[best_sil_idx],
                                                   linkage='ward')
            best_bcubed_model = AgglomerativeClustering(n_clusters=n_clusters_values[best_bcubed_idx],
                                                      linkage='ward')

    # Применение t-SNE для визуализации
    from sklearn.manifold import TSNE
    tsne = TSNE(n_components=2, random_state=6417)
    data_tsne = tsne.fit_transform(data)

    # Визуализация лучших моделей
    ax3 = fig.add_subplot(223)
    best_sil_labels = best_sil_model.fit_predict(data)
    plot_2d_data(data_tsne, best_sil_labels,
                title=f'Best Silhouette clustering\nParams: {get_params(best_sil_model)}',
                ax=ax3)

    ax4 = fig.add_subplot(224)
    best_bcubed_labels = best_bcubed_model.fit_predict(data)
    plot_2d_data(data_tsne, best_bcubed_labels,
                title=f'Best B-Cubed clustering\nParams: {get_params(best_bcubed_model)}',
                ax=ax4)

    plt.tight_layout()
    plt.show()

def get_params(model):
    if isinstance(model, DBSCAN):
        return f"eps={model.eps}, min_samples={model.min_samples}"
    elif isinstance(model, KMeans):
        return f"n_clusters={model.n_clusters}"
    else:
        return f"n_clusters={model.n_clusters}, linkage={model.linkage}"

data, labels = make_classification(
    n_samples=1000, n_features=200, n_informative=100,
    n_repeated=0, n_classes=5, n_clusters_per_class=2, weights=None,
    flip_y=0.01, class_sep=2.5, hypercube=True, shift=0.0, scale=1.0,
    shuffle=True, random_state=6417
)

scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
print("Анализ KMeans")

kmeans_params = {'n_clusters': range(2, 11)}
plot_clustering_results(data_scaled, labels, 'KMeans', kmeans_params)

# 2. Анализ DBSCAN
print("\n")
print("Анализ DBSCAN")

dbscan_params = {
    'eps': np.linspace(0.1, 1.0, 10),
    'min_samples': range(5, 16, 2)
}
plot_clustering_results(data_scaled, labels, 'DBSCAN', dbscan_params)


# 3. Анализ AgglomerativeClustering
print("\n")
print("Анализ AgglomerativeClustering")

agg_params = {'n_clusters': range(2, 11)}
plot_clustering_results(data_scaled, labels, 'Agglomerative', agg_params)
Анализ KMeans
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)
/usr/local/lib/python3.11/dist-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning
  super()._check_params_vs_input(X, default_n_init=10)

Анализ DBSCAN

Анализ AgglomerativeClustering

**Ваш ответ здесь:**

  1. Можем заметить, что для KMeans и DBSCAN параметры совпали, для алгоритма AgglomerativeClustering метрики длостигают разных результатов при равных параметрах. Подобранные раннее параметры немного отличаются от новых, это может быть потому что:

    Silhouette учитывает геометрическую компактность кластеров, B-Cubed ориентирован на соответствие истинным меткам, DBSCAN чувствителен к параметрам из-за разной плотности кластеров и опять не справился с задачей.

  2. B-Cubed лучше отражает качество при наличии истинных меток, тогда как Silhouette полезен для полностью неконтролируемой кластеризации. Оптимальные параметры в основном совпадают, так как оба метода стремятся к хорошо разделенным кластерам.

**Задание 2 [Bonus][1 балл]** ¶

image.png

Подкиньте друг другу 3+ идеи, куда сходить/чем заняться на майских :)

Или вставьте/сгенерируйте любой смешной мем на тему весны/лета

1. Шашлыки

2. Покататься на велосипедах/самокатах с семьей или друзьями

3. Рыбалочка или поход

4. Наслаждаться жизнью

image.png

In [ ]:
gdown.download(id='16UgWo1Emt9ar1O4h2Xxed0ZpJZ0OG5V-', output='cifar10_deep_features.npy')
Downloading...
From (original): https://drive.google.com/uc?id=16UgWo1Emt9ar1O4h2Xxed0ZpJZ0OG5V-
From (redirected): https://drive.google.com/uc?id=16UgWo1Emt9ar1O4h2Xxed0ZpJZ0OG5V-&confirm=t&uuid=ec61b418-72a1-41be-bd94-d2e070cbffc1
To: /content/cifar10_deep_features.npy
100%|██████████| 164M/164M [00:03<00:00, 49.8MB/s]
Out[ ]:
'cifar10_deep_features.npy'